/**
 * @param {number[]} coins
 * @param {number} amount
 * @return {number}
 */
 var coinChange = function(coins, amount) {
  if(!amount){
    // 如果没有cmount或者amount是0的话 那就可以直接返回0  
    return 0
  }
  let dp = new Array(amount+1).fill(Infinity) // 生成dp数组初始化为都是infinity dp[i]表示凑成i金额所需的最小硬币的个数
  dp[0] = 0 // 凑成0金额最小的硬币是0个
  for(let i = 0;i < coins.length;i++){
    // 遍历硬币
    for(let j = coins[i];j <= amount;j++){
      // 遍历总价值容量
      dp[j] = Math.min(dp[j-coins[i]]+1,dp[j]) // 金额j所需要的最小的硬币的个数 是 价格为j-coins[i]所需要的硬币数+1 和 金额为j所需要的硬币数其中的最小值
    }
  }
  return dp[amount] === Infinity ? -1 :dp[amount] //如果最后是infinity说明没有这个组合 那就直接返回-1  否则返回值这个值
};